angular.module('myApp')
  .directive('hasPermission', function(permissions) {
     return {
         link: function(scope, element, attrs) {
             if(!angular.isString(attrs.hasPermission))
                 throw "hasPermission value must be a string";

             var value = attrs.hasPermission.trim();
             /*
              * notPermissionFlag 是用来判断没有权限 的情况
              * 例如 <div has-Permission='!edit'></div> 没有编辑权限的情况显示这个div
              * hasPermission = false （对于edit这个权限来说，某个用户没有这个权限）
              * notPermissionFlag = true (某个用户没有这个权限)
              */
             var notPermissionFlag = value[0] === '!';
             if(notPermissionFlag) {
                 value = value.slice(1).trim();
             }
             function toggleVisibilityBasedOnPermission() {
                 var hasPermission = permissions.hasPermission(value);
                 if(hasPermission && !notPermissionFlag || !hasPermission && notPermissionFlag)
                     element.show();
                 else
                     element.hide();
             }
             toggleVisibilityBasedOnPermission();
             scope.$on('permissionsChanged', toggleVisibilityBasedOnPermission);
         }
     };
  });